﻿using System;
using System.Collections.Generic;
using System.Windows;
using System.Windows.Documents;
using System.Windows.Input;
using Innvoice.Logica.GestorDB;
using Innvoice.Logica.GestorObject;
using System.Globalization;
using Innvoice.Logica.GestorObject.Articulo;

namespace Innvoice.Ws.Facturacion.Remitos
{
    /// <summary>
    /// Lógica de interacción para AltaRemito.xaml
    /// </summary>
    public partial class AltaRemito : Window
    {
        #region Property

        //Manejadores de Bases de Datos
        private RemitoDB remitoDB = new RemitoDB();
        private ClienteDB clienteDB = new ClienteDB();
        private ArticuloDB articuloDB = new ArticuloDB();

        private Remito remito = new Remito();


        #endregion

        #region Contructor

        public AltaRemito()
        {
            InitializeComponent();
            this.codigoClienteValue.Focus();
            DataContext = remito;
            this.nroRemitoValue.Text = remitoDB.GetProximoNumeroRemito();
            importeTotalValue.Text = "0";
        }

        #endregion

        #region Windows Methods

        private void btnCancelar_Click(object sender, RoutedEventArgs e)
        {
            this.Close();
        }

        private void btnAceptar_Click(object sender, RoutedEventArgs e)
        {
            GuardarRemito();
        }

        private void CodigoClienteValue_KeyDown(object sender, KeyEventArgs e)
        {
            switch (e.Key.ToString().ToUpper())
            {
                case "TAB":
                    LlenarEncabezadoSegunCodigoCliente();
                    break;
                default:
                    break;
            }
        }

        private void cantValue_KeyDown(object sender, KeyEventArgs e)
        {
            switch (e.Key.ToString().ToUpper())
            {
                case "TAB":
                    codigoValue.IsEnabled = true;
                    break;
                default:
                    break;
            }
        }

        private void codigoValue_KeyDown(object sender, KeyEventArgs e)
        {
            switch (e.Key.ToString().ToUpper())
            {
                case "TAB":
                    descripcionValue.IsEnabled = true;
                    precioUnitarioValue.IsEnabled = true;
                    int codigo = Convert.ToInt16(codigoValue.Text);
                    SubArticulo subArticulo = articuloDB.ObtenerSubArticulo(codigo);
                    descripcionValue.Text = subArticulo.Descripcion + " - " + subArticulo.ArticuloDescripcion + " - " + subArticulo.CategoriaDescripcion;
                    precioUnitarioValue.Text = subArticulo.PrecioNeto.ToString();
                    break;
                default:
                    break;
            }
        }

        private void precioUnitarioValue_KeyDown(object sender, KeyEventArgs e)
        {
            switch (e.Key.ToString().ToUpper())
            {
                case "RETURN":
                    LlenarCampoPrecioTotal();
                    AgregarItemRemito();
                    Limpiar_y_DesactivarCampos();
                    ActualizarCampoImporte();
                    break;
                default:
                    break;
            }
        }

        private void CodigoClienteValue_LostFocus(object sender, RoutedEventArgs e)
        {
            LlenarEncabezadoSegunCodigoCliente();
        }

        private void Window_KeyDown(object sender, KeyEventArgs e)
        {
            switch (e.Key.ToString().ToUpper())
            {
                case "F1":
                    break;
                case "ESCAPE":
                    this.Close();
                    break;
                default:
                    return;
            }
        }

        #endregion

        #region Auxiliar Methods

        private void LlenarEncabezadoSegunCodigoCliente()
        {
            if (!this.codigoClienteValue.Text.Equals(""))
            {
                Cliente cliente = new Cliente();
                int codigoCliente = Convert.ToInt16(this.codigoClienteValue.Text.ToString());
                cliente = remitoDB.ObtenerClientePorCodigo(codigoCliente);
                this.razonSocialClienteTextBox.Text = cliente.RazonSocial;
                LlenarCondicionDePago();
                condicionDePagoComboBox.SelectedIndex = cliente.NroCondicionDePago - 1;
            }
        }

        private void LlenarCondicionDePago()
        {
            List<CondicionDePago> condicionDePago = new List<CondicionDePago>();
            condicionDePago = remitoDB.ObtenerCodicionesDePago();

            condicionDePagoComboBox.ItemsSource = condicionDePago;
        }

        private void GuardarRemito()
        {
            //remitoDB.AddRemito(remito);
        }

        private void LlenarCampoPrecioTotal()
        {
            int cantidad = Convert.ToInt16(cantValue.Text);
            double precioUnitario = Convert.ToDouble(precioUnitarioValue.Text);
            //precioTotalValue.Text = (cantidad * precioUnitario).ToString("C2", CultureInfo.CreateSpecificCulture("en-US"));
            precioTotalValue.Text = (cantidad * precioUnitario).ToString();
            cantValue.Focus();
        }

        private void AgregarItemRemito()
        {
            ItemRemito itemRemito = new ItemRemito();

            itemRemito.Cantidad = Convert.ToInt16(cantValue.Text);
            itemRemito.CodigoSubArticulo = Convert.ToInt16(codigoValue.Text);
            itemRemito.Descripcion = descripcionValue.Text;
            itemRemito.PrecioUnitario = Convert.ToDecimal(precioUnitarioValue.Text);
            itemRemito.NroFactura1 = 1;
            itemRemito.NroFactura2 = Convert.ToInt16(remitoDB.GetProximoSegundoNumeroRemito());
            itemRemito.PrecioTotal = Convert.ToDouble(itemRemito.Cantidad * itemRemito.PrecioUnitario);

            remito.Items.Add(itemRemito);

            dgArticulosRemitos.Items.Insert(dgArticulosRemitos.Items.Count, itemRemito);
        }

        private void Limpiar_y_DesactivarCampos()
        {
            cantValue.Text = "";

            codigoValue.Text = "";
            codigoValue.IsEnabled = false;

            descripcionValue.Text = "";
            descripcionValue.IsEnabled = false;

            precioUnitarioValue.Text = "";
            precioUnitarioValue.IsEnabled = false;

            precioTotalValue.Text = "";
            precioTotalValue.IsEnabled = false;
        }

        private void ActualizarCampoImporte()
        {
            //double resultado = Convert.ToDouble(importeTotalValue.Text.Replace("$",""));
            double resultado = 0;

            foreach( ItemRemito item in remito.Items)
            {
                Console.WriteLine("Total: " + item.PrecioTotal);
                resultado = resultado + item.PrecioTotal;
            }

            //importeTotalValue.Text = resultado.ToString("C2", CultureInfo.CreateSpecificCulture("en-US"));
            importeTotalValue.Text = resultado.ToString();
        }

        #endregion
    }
}
